package com.cool.shark.service.Impl;

import com.cool.shark.ex.ServiceException;
import com.cool.shark.mapper.AdminMapper;
import com.cool.shark.pojo.dto.AddAdminDto;
import com.cool.shark.pojo.dto.AdminDto;
import com.cool.shark.pojo.dto.AdminUpdateDto;
import com.cool.shark.pojo.entity.Admin;
import com.cool.shark.pojo.vo.AdminListItemVO;
import com.cool.shark.pojo.vo.AdminStandardVO;
import com.cool.shark.pojo.vo.ProductCategoryVo;
import com.cool.shark.service.AdminService;
import com.cool.shark.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;


import java.util.Iterator;
import java.util.List;

/**
 * @Name: AdminServiceImpl
 * @Author: 西风残叶
 * @Date: 2024/3/31 20:58
 * @Version: 1.0
 * @TODO: TODO
 */
@Service
@Slf4j
public class AdminServiceImpl implements AdminService {
    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();

    @Autowired
    private AdminMapper mapper;

    /**
     * 添加管理员信息的实现。
     * 该方法接收一个管理员信息的数据传输对象（AdminDto），用于添加新的管理员信息到数据库中。
     *
     * @param AdminDTO 管理员信息的数据传输对象，包含要添加的管理员信息的详细信息。
     *                 该参数不可为null，否则会触发异常。
     *                 <p>
     *                 注：该方法没有返回值，添加操作的结果通过其他方式（如界面提示或日志记录）进行反馈。
     */
    @Override
    public void addAdmin(AddAdminDto AdminDTO) {
        log.info("开始处理管理员添加业务....,参数:{}", AdminDTO);
        if ("root".equals(AdminDTO.getUsername()) || "超级管理员".equals(AdminDTO.getRole())) {
            String message = "不允许添加,超级管理员";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST, message);
        }
        log.info(AdminDTO.getUsername());
        if (!AdminDTO.getUsername().startsWith("G") ||
                !(AdminDTO.getUsername().length() >= 4 &&
                        AdminDTO.getUsername().length() <= 10)) {
            String message = "用户名格式不正确";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST, message);
        }
        if (!AdminDTO.getPhone().matches("^(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|" +
                "14[57]|19[1-9])[0-9]{8}$")) {
            String message = "手机号格式不正确";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST, message);
        }
        if (!AdminDTO.getEmail().matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$")) {
            String message = "邮箱格式不正确";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST, message);
        }
        Admin admin = new Admin();
        BeanUtils.copyProperties(AdminDTO, admin);
        String encode = encoder.encode(admin.getPassword());
        admin.setPassword(encode);
        int insert = mapper.insert(admin);
        if (insert != 1) {
            String message = "添加失败";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST, message);
        }
        log.info("管理员添加成功");
    }

    /**
     * 登录功能的实现。
     * 该方法接收一个管理员信息的数据传输对象（AdminDto），用于验证管理员的登录凭证。
     *
     * @param adminDto 管理员信息的数据传输对象，包含登录所需的用户名和密码等信息。
     *                 该参数不可为null，否则会触发异常。
     *                 <p>
     *                 注：该方法没有返回值，登录验证的结果通过其他方式（如界面提示或日志记录）进行反馈。
     */
    @Override
    public Admin login(AdminDto adminDto) {
        log.info("开始处理管理员登录业务....,参数:{}", adminDto);
        String username = adminDto.getUsername();
        Admin byUsername = mapper.getByUsername(username);
        if (byUsername == null) {
            String message = "管理员不存在,请联系超级管理员!";
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        if (!encoder.matches(adminDto.getPassword(), byUsername.getPassword())) {
            String message = "密码错误,请重新输入!";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST, message);
        }
        log.debug("管理员登录成功,管理员信息:{}", byUsername);
        return byUsername;
    }

    /**
     * 获取管理员列表项的视图对象列表。
     *
     * @return 返回一个包含管理员列表项视图对象的列表。每个视图对象代表一个管理员的列表项信息。
     */
    @Override
    public List<AdminListItemVO> list() {
        log.debug("开始处理查询管理员列表....");
        List<AdminListItemVO> list = mapper.list();
        Iterator<AdminListItemVO> iterator = list.iterator();
        while (iterator.hasNext()) {
            AdminListItemVO next = iterator.next();
            if ("root".equals(next.getUsername())) {
                iterator.remove();
            }
        }
        return list;
    }

    /**
     * 获取管理员列表项的视图对象列表。
     *
     * @return 返回一个包含管理员列表项视图对象的列表。每个视图对象代表一个管理员的列表项信息。
     */
    @Override
    public List<ProductCategoryVo> getProductCategory() {
        log.debug("开始处理查询商品类别数据....");
        List<ProductCategoryVo> productCategory = mapper.getProductCategory();
        log.debug("查询商品类别数据成功,商品类别数据:{}", productCategory);
        return productCategory;
    }

    /**
     * 获取商品数量
     * 本方法不接受任何参数。
     *
     * @return 返回当前系统中的商品数量。返回类型为int。
     */
    @Override
    public int goodsCount() {
        log.info("开始查询商品个数");
        int num = mapper.goodsCount();
        return num;
    }

    /**
     * 根据用户名获取管理员标准信息。
     *
     * @param username 想要查询的管理员的用户名。
     * @return AdminStandardVO 类型的管理员标准信息对象。如果找不到对应的管理员，返回null。
     */
    @Override
    public AdminStandardVO getAdminByUsername(String username) {
        log.info("开始处理根据用户名查询管理员信息....,参数:{}", username);
        AdminStandardVO adminStandardVO = mapper.getAdminByUsername(username);
        return adminStandardVO;
    }

    @Override
    public void updateAdmin(AdminUpdateDto adminUpdate) {
        log.info("开始处理修改个人信息业务,参数:{}", adminUpdate);
        String username = adminUpdate.getUsername();
        Admin byUsername = mapper.getByUsername(username);
        if (byUsername == null) {
            String meg = "修改失败,用户不存在";
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, meg);
        }
        if (!encoder.matches(adminUpdate.getOldPassword(), byUsername.getPassword())) {
            String meg = "修改失败,密码错误";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST, meg);
        }
        Admin admin = new Admin();
        BeanUtils.copyProperties(adminUpdate, admin);
        String encode = encoder.encode(admin.getPassword());
        admin.setPassword(encode);
        log.debug("修改个人信息成功,修改后的信息:{}", admin);
        int i = mapper.updateAdminByUsername(admin);
        if (i != 1) {
            String meg = "修改失败";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST, meg);
        }
        log.info("修改个人信息成功");
    }

    @Override
    public void deleteAdmin(String username) {
        log.info("开始处理删除业务,参数:{}", username);
        int i = mapper.deleteAdmin(username);
        if (i != 1) {
            String meg = "删除失败,服务器忙!";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST, meg);
        }
        log.info("删除成功");
    }
}